package cn.demoncat.util.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.web.multipart.MultipartFile;

import cn.demoncat.util.exception.IoRuntimeException;
import cn.demoncat.util.lang.constant.StringConstant;

/**
 * 文件上传(SpringMVC原生)
 * 
 * @author 延晓磊
 *
 * @since 2016年6月3日
 */
public final class FileUploadUtil {
 
	//文件上传的日期分隔符
	private static final String DATE_SPE = "yyyy/MM/dd/";
	
	/**
	 * 上传文件
	 * 
	 * @param file 文件
	 * @param uploadPath 文件上传的相对路径
	 * @param rootPath 	   文件上传的根路径
	 */
	public static void uploadFile(MultipartFile file, String uploadPath, String rootPath){
		// 创建文件
		File f = new File(rootPath + uploadPath);
		// 创建父目录
		FileUtil.addParentDir(f);
		// 上传文件
		try {
			//复制文件，如果已存在则删除原文件
			file.transferTo(f);
		} catch (IllegalStateException | IOException e) {
			throw new IoRuntimeException("文件上传失败", e);
		}
	}
	/**
	 * 上传文件（使用NIO）
	 * 
	 * @param file 文件
	 * @param uploadPath 文件上传的相对路径
	 * @param rootPath 	   文件上传的根路径
	 */
	public static void uploadFileNio(MultipartFile file, String uploadPath, String rootPath){
		// 创建文件
		File f = new File(rootPath + uploadPath);
		// 创建父目录
		FileUtil.addParentDir(f);
		// 上传文件
		try {
			//复制文件，使用NIO输出
			NioUtil.copy(file.getInputStream(), new FileOutputStream(f));
		} catch (IllegalStateException | IOException e) {
			throw new IoRuntimeException("文件上传失败", e);
		}
	} 
	
	/**
	 * 生成文件上传的相对路径(模块名称在后)
	 * 
	 * @param file 文件
	 * @param modulePath 模块名称
	 * 
	 * @return 文件上传的相对路径：年/月/日/模块名称/随机名.后缀
	 */
	public static String getUploadPath(MultipartFile file, String modulePath) {
		//文件原名
		String name = file.getOriginalFilename();
		//文件扩展名
		String suffix = FileNameUtil.getExtension(name);
		//文件新名：随机数.后缀名
		name = new Date().getTime() + RandomStringUtils.randomNumeric(3);
		if(StringUtils.isNotBlank(suffix)) name = name +StringConstant.POINT+ suffix;
		//文件上传和访问的路径：年/月/日/模块名称/随机名.后缀
		return DateFormatUtils.format(new Date(), DATE_SPE) + modulePath + StringConstant.SEPARATOR + name;
	}
	
	/**
	 * 生成文件上传的相对路径(模块名称在前)
	 * 
	 * @param file 文件
	 * @param modulePath 模块名称
	 * 
	 * @return 文件上传的相对路径：模块名称/年/月/日/随机名.后缀
	 */
	public static String getUploadPath2(MultipartFile file, String modulePath) {
		//文件原名
		String name = file.getOriginalFilename();
		//文件扩展名
		String suffix = FileNameUtil.getExtension(name);
		//文件新名：随机数.后缀名
		name = new Date().getTime() + RandomStringUtils.randomNumeric(3);
		if(StringUtils.isNotBlank(suffix)) name = name +StringConstant.POINT+ suffix;
		//文件上传和访问的路径：年/月/日/模块名称/随机名.后缀
		return modulePath + StringConstant.SEPARATOR + DateFormatUtils.format(new Date(), DATE_SPE) +  name;
	}
	
}
